#pragma once

#include <stdint.h>
#include <functional>

using TaskFunc = std::function<void()>;
using ReleaseFunc = std::function<void()>;
class TimerTask
{
private:
    uint64_t _id;      // 定时器任务对象ID，定时任务必须得找得着，一个程序里定时任务可能有很多
    uint32_t _timeout; // 定时器任务的超时时间
    bool _canceled;    // true   ---定时器任务取消了   false -- 没有取消
    TaskFunc _task_cb; // 定时器要执行的定时任务

    /*
    用于删除TimerWheel中保存的定时器任务对象信息，定时任务释放的时候也要清理TimerWheel中保存的定时器对象信息
    为什么将这个_release设置到TimerTask里面呢，不在TimerWheel层管理？
    因为这个TimerWheel不知道是否某个定时任务真的释放了，而TimerTask是最清楚的，自己真的释放了就会调用析构函数
    */
    ReleaseFunc _release; // 用于删除TimeWhile中保存的定时器任务对象信息（删除unordered_ma中的元素）

public:
    TimerTask(uint64_t id, uint32_t delay, const TaskFunc &cb);
    ~TimerTask();

    // 1. 设置定时器任务的释放
    void SetRelease(const ReleaseFunc &cb);

    // 2. 获取当前定时任务超时时间
    uint32_t DelayTime();

    void Cancel();
};